package com.example.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.example.constant.ResultCodeConstant;
import com.example.dto.PostgraduateInfoDTO;
import com.example.entity.PostgraduateInfoDO;
import com.example.exception.BusinessException;
import com.example.mapper.PostgraduateInfoMapper;
import com.example.query.PostgraduateInfoQuery;
import com.example.service.PostgraduateInfoService;
import com.example.service.UserService;
import java.util.Date;
import java.util.List;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class PostgraduateInfoServiceImpl implements PostgraduateInfoService {

    @Autowired
    private PostgraduateInfoMapper postgraduateInfoMapper;

    @Autowired
    private UserService userService;

    @Override
    @Transactional
    public Boolean addPostgraduateInfo(PostgraduateInfoDTO postgraduateInfoDTO) {
        // 检查用户是否存在
        if (!userService.exists(postgraduateInfoDTO.getUserId())) {
            throw new BusinessException(ResultCodeConstant.CODE_000001, ResultCodeConstant.CODE_000001_MSG);
        }

        PostgraduateInfoDO postgraduateInfoDO = new PostgraduateInfoDO();
        BeanUtils.copyProperties(postgraduateInfoDTO, postgraduateInfoDO);
        postgraduateInfoDO.setShareStatus(postgraduateInfoDTO.getShareStatus() != null ? postgraduateInfoDTO.getShareStatus() : false);
        postgraduateInfoDO.setCreateTime(new Date());
        postgraduateInfoDO.setUpdateTime(new Date());
        postgraduateInfoDO.setCreateBy(postgraduateInfoDTO.getUserId());
        postgraduateInfoDO.setUpdateBy(postgraduateInfoDTO.getUserId());

        return postgraduateInfoMapper.insert(postgraduateInfoDO) > 0;
    }

    @Override
    @Transactional
    public Boolean updatePostgraduateInfo(PostgraduateInfoDTO postgraduateInfoDTO) {
        // 检查考研信息是否存在
        PostgraduateInfoDO existingInfo = postgraduateInfoMapper.selectById(postgraduateInfoDTO.getInfoId());
        if (existingInfo == null) {
            throw new BusinessException(ResultCodeConstant.CODE_000001, "考研信息不存在");
        }

        // 检查用户是否存在
        if (!userService.exists(postgraduateInfoDTO.getUserId())) {
            throw new BusinessException(ResultCodeConstant.CODE_000001, "用户信息不存在");
        }

        PostgraduateInfoDO postgraduateInfoDO = new PostgraduateInfoDO();
        BeanUtils.copyProperties(postgraduateInfoDTO, postgraduateInfoDO);
        postgraduateInfoDO.setUpdateTime(new Date());
        postgraduateInfoDO.setUpdateBy(postgraduateInfoDTO.getUserId());

        return postgraduateInfoMapper.updateById(postgraduateInfoDO) > 0;
    }

    @Override
    @Transactional
    public Boolean deletePostgraduateInfo(Integer infoId) {
        // 检查考研信息是否存在
        PostgraduateInfoDO existingInfo = postgraduateInfoMapper.selectById(infoId);
        if (existingInfo == null) {
            throw new BusinessException(ResultCodeConstant.CODE_000001, "考研信息不存在");
        }

        return postgraduateInfoMapper.deleteById(infoId) > 0;
    }

    @Override
    public List<PostgraduateInfoDO> getPostgraduateInfos(PostgraduateInfoQuery postgraduateInfoQuery) {
        QueryWrapper<PostgraduateInfoDO> wrapper = Wrappers.query();

        if (postgraduateInfoQuery.getUserId() != null) {
            wrapper.eq("user_id", postgraduateInfoQuery.getUserId());
        } else {
            wrapper.eq("share_status", true);
        }

        return postgraduateInfoMapper.selectList(wrapper);
    }

    @Override
    @Transactional
    public Boolean importPostgraduateInfo(Integer fileId) {
        // 检查文件是否存在
        if (!checkFileExists(fileId)) {
            throw new BusinessException(ResultCodeConstant.CODE_000001, "文件不存在");
        }

        // 解析文件并导入考研信息到数据库
        // TODO: 实现文件解析和导入逻辑
        return true;
    }

    @Override
    public List<PostgraduateInfoDO> exportPostgraduateInfos(List<Integer> infoIds) {
        QueryWrapper<PostgraduateInfoDO> wrapper = Wrappers.query();

        if (infoIds != null && !infoIds.isEmpty()) {
            wrapper.in("info_id", infoIds);
        } else {
            wrapper.eq("share_status", true);
        }

        return postgraduateInfoMapper.selectList(wrapper);
    }

    private boolean checkFileExists(Integer fileId) {
        // TODO: 实现文件存在性检查逻辑
        return true;
    }
}